package jmine.tec.web.wicket.component.command.img;

import java.io.Serializable;

import org.apache.wicket.Page;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.html.link.AbstractLink;

/**
 * Implementação base de {@link ImageCommand} que utiliza links com ajax.
 * 
 * @author Rafael Volpato
 * @date Dec 8, 2011
 */
public abstract class AbstractAjaxImageCommand implements ImageCommand {

    /**
     * Executa a ação do comando.
     * 
     * @param target {@link AjaxRequestTarget}
     * @param commandParam parametro para o comando
     * @return {@link Page} para onde deve ser direcionado após executar a ação (pode ser <code>null</code>).
     */
    protected abstract Page execute(AjaxRequestTarget target, Serializable commandParam);

    /**
     * Cria uma nova instancia de um componente do tipo {@link AjaxLink}.
     * 
     * @param id id que deve ser utilizado no link
     * @param commandParam parametro do comando a ser executado
     * @return uma nova instancia de um componente do tipo {@link AjaxLink}
     */
    public AbstractLink createLinkComponent(final String id, final Serializable commandParam) {
        return new AjaxLink<Void>(id) {
            @Override
            public void onClick(AjaxRequestTarget target) {
                AbstractAjaxImageCommand.this.execute(target, commandParam);
            }
        };
    }
}
